#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"

# 可执行文件目录
BUILD_DIR="${ROOT_DIR}/build"

SRV=(rpc_server1 rpc_server2 rpc_server3 rpc_server4 rpc_server5 rpc_server6)
PIDS=()

start_one(){
  local i=$1
  if [ -x "${BUILD_DIR}/${SRV[$i]}" ]; then
    "${BUILD_DIR}/${SRV[$i]}" >/dev/null 2>&1 &
    PIDS[$i]=$!
    echo "start ${SRV[$i]} pid=${PIDS[$i]}"
  else
    echo "missing ${BUILD_DIR}/${SRV[$i]}" >&2
  fi
}

stop_one(){
  local i=$1
  local pid=${PIDS[$i]:-}
  if [ -n "${pid}" ] && kill -0 "${pid}" 2>/dev/null; then
    kill -TERM "${pid}" || true
    sleep 0.2
    kill -KILL "${pid}" 2>/dev/null || true
    echo "stop ${SRV[$i]} pid=${pid}"
  fi
  PIDS[$i]=''
}

start_all(){
  for i in $(seq 0 5); do start_one $i; done
}

stop_all(){
  for i in $(seq 0 5); do stop_one $i; done
}

flip_loop(){
  local secs=${1:-3600}  # 默认1小时
  local end=$(( $(date +%s) + secs ))
  local count=0
  local current_server=0
  echo "开始服务顺序动态上下线测试，持续时间: ${secs}秒 ($(($secs/60))分钟)"
  
  while [ $(date +%s) -lt $end ]; do
    # 检查是否收到退出信号
    if [ -f "/tmp/stop_flip_test" ]; then
      echo "检测到停止信号，提前结束测试"
      rm -f "/tmp/stop_flip_test"
      break
    fi
    
    i=$current_server
    echo "[$(date '+%H:%M:%S')] 第$((++count))次操作: 重启 ${SRV[$i]} (${i}/5)"
    
    stop_one $i
    sleep 1.0  # 下线后等待1秒，让客户端感知到服务下线
    start_one $i
    sleep 3.0  # 上线后等待3秒，让服务完全就绪并处理积压请求
    
    # 按顺序循环：0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0 -> ...
    current_server=$(( (current_server + 1) % 6 ))
  done
  echo "服务顺序动态测试完成，总共执行 $count 次服务重启"
}

# 增强的信号处理
cleanup() {
  echo "收到退出信号，正在清理..."
  touch "/tmp/stop_flip_test"  # 通知循环退出
  stop_all
  echo "所有服务已停止"
  exit 0
}

# 清理可能残留的停止标志
rm -f "/tmp/stop_flip_test"

trap cleanup INT TERM
trap stop_all EXIT

echo "=== 启动所有服务端 ==="
start_all
sleep 3  # 等待所有服务启动完成

echo "=== 开始动态服务测试 ==="
flip_loop ${1:-3600}  # 默认1小时，可通过参数自定义

